package com.zwh.tool.utils;

/**
 * 这是一个数组的工具类,包含了打印数组/排序/搜索等常用的方法
 * @author yexi
 */
public final class ArrayUtils {
    private ArrayUtils() {
    }

    /**
     * 数组复制
     *
     * @param fromArr
     * @param fromIndex
     * @param toArr
     * @param toIndex
     * @param length
     */
    public static void arrayCopy(int[] fromArr, int fromIndex, int[] toArr, int toIndex, int length) {
        for (int i = 0; i < length; i++) {
            toArr[toIndex + i] = fromArr[fromIndex + i];
        }
    }

    private static void swap(int[] array, int m, int n) {
        int tmp;
        tmp = array[m];
        array[m] = array[n];
        array[n] = tmp;
    }

    /**
     * 冒泡排序
     *
     * @param array
     */
    public static void bubbleSort(int[] array) {
        //TIPS:此处例代码为已经经过了算法优化后的展示版本,实际操作时请务必能够想起推演过程
        //控制趟数
        for (int i = 0; i < array.length - 1/*因为只比较数组长度-1次*/; i++) {
            //两两相互比较
            for (int j = 0; j < array.length - 1 - i/*随着趟数的增加,比较次数在减少*/; j++) {
                if (array[j] > array[j + 1]) {
                    swap(array, j, j + 1);
                }
            }
        }
        //test
        for (int item : array) {
            System.out.println(item);
        }

        //随着趟数的增加,比较次数在减少
    }

    /**
     * @param array 目标数组
     * @param key   目标元素
     * @return 返回索引, 如果没有找到返回-1
     */
    public static int binarySearch(int[] array, int key) {
        int low = 0;
        int high = array.length - 1;
        //二分法结束查找的条件
        int mid, val;
        while (low <= high) {
            mid = (low + high) / 2;
            val = array[mid];
            if (val < key) {
                low = mid + 1;
            } else if (val > key) {
                high = mid - 1;
            }else{
                return mid;
            }
        }
        return -1;
    }

    public static void printArray(int[] array) {
        //输出数组元素的格式:[1,2,3,4]
        String str = "[";
        int item;
        //这样会好很多,防止访问堆空间太频繁,提前取出来可以快很多(在该例子中不明显,在需要多次进行重复运算的业务上就容易懂了)
        for (int i = 0; i <= array.length - 1; i++) {
            item = array[i];
            if (i == array.length - 1) {
                str += item + "]";
            } else {
                str += item + ",";
            }
        }
        System.out.println(str);
    }
}
